home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / MiscKit1.7.1 / MiscKit / Palettes / MiscCalendarPalette / MiscCalendarView.subproj / SimpleDate.m < prev   
Text File  |  1995-04-12  |  4KB  |  248 lines

  1. // Copyright (C) 1995 Jon Kutemeier
  2. // Use is governed by the MiscKit license
  3.  
  4. /******************************************************************************
  5.  *      $Log$
  6.  ******************************************************************************/
  7. static char *ident = "$Id$";
  8. static int __hack(int x)
  9. {if(x)return x;else return __hack((int)*ident);}
  10. /*****************************************************************************/
  11.  
  12. #import <libc.h>
  13.  
  14. #import "SimpleDate.h"
  15.  
  16. static int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  17. static char *months[] = {"", "January", "February", "March", "April", \
  18.              "May", "June", "July", "August", "September", \
  19.              "October", "November", "December"};
  20.  
  21. @interface SimpleDate (Private)
  22.  
  23. - _setToday;
  24. - (BOOL)_isValidYear:(int)year month:(int)month day:(int)day;
  25. - (BOOL)_isLeapYear:(int)year;
  26.  
  27. @end
  28.  
  29. @implementation SimpleDate
  30.  
  31. - init
  32. {
  33.     [super init];
  34.  
  35.     [self _setToday];
  36.  
  37.     return self;
  38. }
  39.  
  40. - (int)day
  41. {
  42.     return day;
  43. }
  44.  
  45. - (int)month
  46. {
  47.     return month;
  48. }
  49.  
  50. - (int)year
  51. {
  52.     return year;
  53. }
  54.  
  55. - setYear:(int)aYear month:(int)aMonth day:(int)aDay
  56. {
  57.     if (![self _isValidYear:aYear month:aMonth day:aDay])
  58.       return nil;
  59.  
  60.     year = aYear;
  61.     month = aMonth;
  62.     day = aDay;
  63.  
  64.     return self;
  65. }
  66.  
  67. - (int)numberOfDaysInMonth
  68. {
  69.     if ([self _isLeapYear:year] && month == 2)
  70.       return 29;
  71.  
  72.     return days[month];
  73. }
  74.  
  75. - (int)startDayOfMonth
  76. {
  77.     struct tm date;
  78.     time_t time;
  79.  
  80.     date.tm_sec = 0;
  81.     date.tm_min = 0;
  82.     date.tm_hour = 0;
  83.     date.tm_mday = 1;
  84.     date.tm_mon = month - 1;
  85.     date.tm_year = year - 1900;
  86.     date.tm_wday = 0;
  87.     date.tm_yday = 0;
  88.     date.tm_isdst = 0;
  89.     date.tm_gmtoff = 0;
  90.     date.tm_zone = "";
  91.  
  92.     time = mktime(&date);
  93.  
  94.     date = *localtime(&time);
  95.  
  96.     time -= date.tm_gmtoff;
  97.  
  98.     date = *localtime(&time);
  99.  
  100.     return date.tm_wday;
  101. }
  102.     
  103. - incrementMonth
  104. {
  105.     if (month == 12)
  106.       month = 1;
  107.     else
  108.       month++;
  109.  
  110.     if (day > days[month])
  111.       day = days[month];
  112.  
  113.     return self;
  114. }
  115.  
  116. - decrementMonth
  117. {
  118.     if (month == 1)
  119.       month = 12;
  120.     else
  121.       month--;
  122.  
  123.     if (day > days[month])
  124.       day = days[month];
  125.  
  126.     return self;
  127. }
  128.  
  129. - incrementYear
  130. {
  131.     if (year+1 == 2038)
  132.       return nil;
  133.  
  134.     if ([self _isLeapYear:year] && ![self _isLeapYear:year+1] &&
  135.     month == 2 && day == 29)
  136.       day = 28;
  137.  
  138.     year++;
  139.  
  140.     return self;
  141. }
  142.  
  143. - decrementYear
  144. {
  145.     if (year == 1970)
  146.       return nil;
  147.  
  148.     if ([self _isLeapYear:year] && ![self _isLeapYear:year-1] &&
  149.     month == 2 && day == 29)
  150.       day = 28;
  151.  
  152.     year--;
  153.  
  154.     return self;
  155. }
  156.  
  157. - (const char *)monthStringValue
  158. {
  159.     return months[month];
  160. }
  161.  
  162. - (const char *)dateStringValue
  163. {
  164.     sprintf(dateString, "%s %d, %d", months[month], day, year);
  165.  
  166.     return dateString;
  167. }
  168.  
  169. - read:(NXTypedStream *)aStream
  170. {
  171.     [super read:aStream];
  172.  
  173.     NXReadTypes(aStream, "iii", &day, &month, &year);
  174.  
  175.     return self;
  176. }
  177.  
  178.  
  179. - write:(NXTypedStream *)aStream
  180. {
  181.     [super write:aStream];
  182.  
  183.     NXWriteTypes(aStream, "iii", &day, &month, &year);
  184.  
  185.     return self;
  186. }
  187.  
  188. @end
  189.  
  190. @implementation SimpleDate (Private)
  191.  
  192. - _setToday
  193. {
  194.     struct tm    *tmstruct;
  195.     time_t    now;
  196.  
  197.     now = time(0);
  198.  
  199.     /* Get the tm structure for the time right now */
  200.  
  201.     tmstruct = localtime(&now);
  202.  
  203.     /* Grab the year, month and day info from the tm struct */
  204.  
  205.     year = tmstruct->tm_year + 1900;
  206.     month = tmstruct->tm_mon + 1;
  207.     day = tmstruct->tm_mday;
  208.  
  209.     return self;
  210. }
  211.  
  212. - (BOOL)_isValidYear:(int)aYear month:(int)aMonth day:(int)aDay
  213. {
  214.     /* Is it a valid year? We do not accept any date before */
  215.     /* January 1, 1970 */
  216.  
  217.     if (aYear < 1970)
  218.       return NO;
  219.  
  220.     /* Is it a valid month? */
  221.  
  222.     if (aMonth < 1  ||  aMonth > 12)
  223.       return NO;
  224.  
  225.     /* Is it a valid day? */
  226.     if (aDay < 1)
  227.       return NO;
  228.  
  229.     /* Is it Feburary on a leap year? */
  230.  
  231.     if (aDay > (((month == 2) && [self _isLeapYear:aYear])? 29:days[aMonth]))
  232.       return NO;
  233.  
  234.     /* It is valid! */
  235.  
  236.     return YES;
  237. }
  238.  
  239. - (BOOL)_isLeapYear:(int)aYear
  240. {
  241.     if (((aYear % 4) == 0 && ((aYear % 100) != 0)) || (aYear % 400) == 0)
  242.       return YES;
  243.  
  244.     return NO;
  245. }
  246.  
  247. @end
  248.